/**
 * Copyright © 2016-2025 The Thingsboard Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.terracloud.server.dao.log;

import com.terracloud.server.common.data.log.TerminalLog;
import com.terracloud.server.common.data.id.DeviceId;
import com.terracloud.server.common.data.id.TenantId;
import com.terracloud.server.common.data.id.TerminalLogId;
import com.terracloud.server.common.data.log.LogLevel;
import com.terracloud.server.common.data.log.LogType;
import com.terracloud.server.common.data.page.TimePageLink;
import com.terracloud.server.dao.Dao;

import java.util.List;
import java.util.UUID;

/**
 * 终端日志DAO接口
 */
public interface TerminalLogDao extends Dao<TerminalLog> {

    /**
     * 保存或更新终端日志
     *
     * @param terminalLog 终端日志实体
     * @return 保存后的终端日志实体
     */
    TerminalLog save(TerminalLog terminalLog);

    /**
     * 根据ID查找终端日志
     *
     * @param terminalLogId 终端日志ID
     * @return 终端日志实体，如果不存在则返回null
     */
    TerminalLog findById(TerminalLogId terminalLogId);

    /**
     * 根据ID删除终端日志
     *
     * @param terminalLogId 终端日志ID
     */
    void removeById(TerminalLogId terminalLogId);

    /**
     * 根据设备ID查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param deviceId 设备ID
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findByDeviceId(TenantId tenantId, DeviceId deviceId, TimePageLink pageLink);

    /**
     * 根据租户ID查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findByTenantId(TenantId tenantId, TimePageLink pageLink);

    /**
     * 根据租户ID和日志类型查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param logType 日志类型
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findByTenantIdAndType(TenantId tenantId, LogType logType, TimePageLink pageLink);

    /**
     * 根据租户ID和日志级别查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param logLevel 日志级别
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findByTenantIdAndLevel(TenantId tenantId, LogLevel logLevel, TimePageLink pageLink);

    /**
     * 根据租户ID、设备ID和日志类型查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param deviceId 设备ID
     * @param logType 日志类型
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findByTenantIdAndDeviceIdAndType(TenantId tenantId, DeviceId deviceId, LogType logType, TimePageLink pageLink);

    /**
     * 根据租户ID、设备ID和日志级别查找终端日志列表
     *
     * @param tenantId 租户ID
     * @param deviceId 设备ID
     * @param logLevel 日志级别
     * @param pageLink 分页参数
     * @return 终端日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<TerminalLog> findByTenantIdAndDeviceIdAndLevel(TenantId tenantId, DeviceId deviceId, LogLevel logLevel, TimePageLink pageLink);

    /**
     * 根据处理状态统计终端日志数量
     *
     * @param tenantId 租户ID
     * @param processStatus 处理状态
     * @return 日志数量
     */
    long countByProcessStatus(TenantId tenantId, com.terracloud.server.common.data.log.LogStatus processStatus);

    /**
     * 根据是否为紧急告警统计终端日志数量
     *
     * @param tenantId 租户ID
     * @param isCritical 是否为紧急告警
     * @return 日志数量
     */
    long countByCritical(TenantId tenantId, boolean isCritical);

    /**
     * 根据持续时间统计超时的终端日志数量
     *
     * @param tenantId 租户ID
     * @param duration 持续时间阈值(毫秒)
     * @return 日志数量
     */
    long countByDurationGreaterThan(TenantId tenantId, long duration);
}